package demo1;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/**
 * Create by jsonor 2017/09/14
 */
public class ConnectionTest {

  static {
    try {
      Class.forName("com.mysql.jdbc.Driver");
    } catch (ClassNotFoundException e) {
      throw new ExceptionInInitializerError(e);
    }
  }
  public static void main(String[] args) {
    /**
     * 每一次操作数据库的实际步骤：
     * 1. 创建链接 （非常耗时）
     * 2. 创建SQL语句
     * 3. 执行语句
     * 如果每一次请求都要执行以上3个步骤，实际效率会非常低
     * 此时，需要对创建链接进行适当的优化：
     * 解决方案：
     *  1. 连接池
     *     -- 首先创建一大堆的链接，先放那
     *     -- 如果用户需要查询数据，那么就从这个链接池中拿出一个链接提供给用户查询使用
     *
     *     需要具备的一些简单的功能：
     *     * 能够容纳很多链接
     *     * 用户使用完了以后，要有归还功能
     *     * 链接不够了，有一定的扩展性
     *     * 链接过多，自动回收
     *     * ...
     *     * # 如何读取配置文件
     *     * # DBCP
     *     * # C3P0
     *     * # DBUtils
     *     * Mybatis
     */
    Connection cn = null;
    try {

      // 一次链接所消耗的事件
      long startTime = System.currentTimeMillis();
      cn = DriverManager.getConnection("jdbc:mysql:///test", "root", "123456789");
      long cnTime = System.currentTimeMillis();

      // 查询所消耗的时间
      PreparedStatement ps = cn.prepareStatement("select * from user");
      ps.execute();
      long psTime = System.currentTimeMillis();

      // 显示时间
      System.out.println("链接所消耗的时间 : " + (cnTime - startTime) + "ms");
      System.out.println("查询所消耗的时间 : " + (psTime - cnTime) + "ms");
    } catch (SQLException e) {
      e.printStackTrace();
    } finally {
      if (cn != null) {
        try {
          cn.close();
        } catch (SQLException e) {
          e.printStackTrace();
        }
      }
    }
  }
}
